using System;
using System.ComponentModel;

namespace App.SolInf.Modelo
{
    public class Producto : INotifyPropertyChanged
    {
        private Double _stockMinimo;
        private Double _stockMaximo;
        private Double _stock;
        private Double _costo;
        private Double _ganancia;

        public virtual Int32 Id { get; set; }
        public virtual String Descripcion { get; set; }
        public virtual Marca Marca { get; set; }
        public virtual CategoriaProducto Categoria { get; set; }

        public virtual event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// Costo actual del producto
        /// </summary>
        public virtual Double Costo
        {
            get { return _costo; }
            set
            {
                _costo = value;
                _propertyChanged("Precio");
            }
        }

        /// <summary>
        /// Indice de ganancia de este producto
        /// </summary>
        public virtual Double Ganancia
        {
            get { return _ganancia; }
            set
            {
                _ganancia = value;
                _propertyChanged("Precio");
            }
        }

        /// <summary>
        /// Retorna el precio del producto calculado
        /// </summary>
        public virtual Double Precio
        {
            get { return Math.Round(Costo*Ganancia, 2); }
            set
            {
                if (Math.Abs(_costo - 0) > Double.Epsilon)
                {
                    _ganancia = Math.Round(value/_costo, 2);
                    _propertyChanged("Ganacia");
                }
            }
        }


        public virtual Double StockMinimo
        {
            get { return _stockMinimo; }
            set
            {
                _stockMinimo = value;
                _propertyChanged("EstadoStock");
            }
        }

        public virtual Double StockMaximo
        {

            get { return _stockMaximo; }
            set
            {
                _stockMaximo = value;
                _propertyChanged("EstadoStock");
            }
        }

        public virtual Double Stock
        {
            get { return _stock; }
            protected set
            {
                _stock = value;
                _propertyChanged("EstadoStock");
            }
        }

        public virtual ProductoEstadoStock EstadoStock
        {
            get
            {
                if (StockMaximo > 0 && Stock > StockMaximo)
                    return ProductoEstadoStock.SobreStock;
                if (Stock < 0.01F)
                    return ProductoEstadoStock.StockNegativo;
                if (Math.Abs(Stock - 0) < 0.01F)
                    return ProductoEstadoStock.SinStock;
                if (StockMinimo > 0 && Stock <= StockMinimo)
                    return ProductoEstadoStock.Minimo;

                return ProductoEstadoStock.Normal;
            }
        }
        
        public override string ToString()
        {
            return Descripcion;
        }

        private void _propertyChanged(string property)
        {
            if (null != PropertyChanged)
                PropertyChanged(this, new PropertyChangedEventArgs(property));

        }
    }
}